package com.message.dao;

import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

/**
 * 使用Hibernate3.3实现数据库的基本操作，包括增删改查等方法
 * 
 * @author LiangJie
 */
public class BaseDaoImpl extends HibernateDaoSupport implements BaseDao {

	/**
	 * 从数据库中获取对象
	 * 
	 * @param clazz
	 *            需要获取的Class
	 * @param id
	 *            需要获取的id号
	 * @return 查询到的Object对象
	 */
	public Object getObject(Class<?> clazz, int id) {
		Session session = null;
		session = HibernateSessionFactory.getSession();
		return session.get(clazz, id);
	}

	/**
	 * 执行增删改查
	 * 
	 * @param obj
	 *            操作对象
	 * @param opt
	 *            执行的操作:1-添加;2-删除;3-修改
	 * @return 0:失败 1:成功
	 */
	public int Update(Object obj, int opt) {
		Session session = null;
		Transaction tx = null;
		try {
			session = HibernateSessionFactory.getSession();
			tx = session.beginTransaction();
			switch (opt) {
			case 1:
				session.save(obj); // 添加操作
				break;
			case 2:
				session.delete(obj); // 删除操作
				break;
			case 3:
				session.update(obj); // 修改操作
				break;
			default:
				return 0;
			}
			tx.commit();
			return 1;
		} catch (Exception e) {
			tx.rollback();
			e.printStackTrace();
			return 0;
		} finally {
			if (session != null) {
				session.close();
				session = null;
			}
		}
	}

	/**
	 * 查询操作
	 * 
	 * @param hql
	 *            hql语句
	 * @param params
	 *            hql语句参数
	 * @return 查询到的对象集合
	 */
	public List<?> query(String hql, Object params) {
		Session session = null;
		try {
			session = HibernateSessionFactory.getSession();
			Query query = session.createQuery(hql);
			if (params != null) {
				query.setProperties(params);
			}
			return query.list();
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		} finally {
			if (session != null) {
				session.close();
			}
		}
	}
	
	/**
	 * 分页查询
	 * @param hql
	 * @param params
	 * @param pageSize
	 * @return
	 */
	public List<?> query(String hql, Object params,int pageNow, int pageSize) {
		Session session = null;
		try {
			session = HibernateSessionFactory.getSession();
			Query query = session.createQuery(hql);
			if (params != null) {
				query.setProperties(params);
			}
			if (pageSize != 0 && pageNow != 0) {
				query.setFirstResult(pageSize * (pageNow -1));
				query.setMaxResults(pageSize);
			}
			return query.list();
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		} finally {
			if (session != null) {
				session.close();
			}
		}
	}
}
